package cool.mylog.mylog2end.controller;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import cool.mylog.mylog2end.bean.User;
import cool.mylog.mylog2end.mapper.UserMapper;
import cool.mylog.mylog2end.utils.DrawCaptchaImage;
import cool.mylog.mylog2end.utils.JwtUtils;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import java.io.IOException;

/**
 * user
 */
@RestController
@RequestMapping("user")
public class UserController {

    @Resource
    UserMapper userMapper;


    /**
     * have_user 返回用户名的数量。
     * 用在注册时。不区分大小写
     * 两参选其一，name 比 openIdQ 优先级高
     *
     * @param name    用户名
     * @param unionidQq QQ的unionid
     * @return 0或1
     */
    @GetMapping("have_user")
    public Long haveUser(String name, String unionidQq) {
        System.out.println("&&&" + unionidQq);
        if (name != null && userMapper.getUserIdByName(name) != null) return 1L;
        else if (unionidQq != null && userMapper.getUserIdByUnionidQq(unionidQq) != null) return 1L;
        else return 0L;
    }

    /**
     * login 通过用户名密码获取用户信息和token
     * name&pswd优先级比openidQ高
     *
     * @param name    用户名
     * @param pswd    密码
     * @param unionidQq QQ的unionid
     * @return 含有token属性的用户对象
     */
    @PostMapping("login")
    User getUser(String name, String pswd, String unionidQq) {
        User user;
        if (name != null && pswd != null) {
            long id = userMapper.getUserByPswd(name, pswd);
            if (id == 0) return null;
            user = userMapper.getUserById(id);
        } else if (unionidQq != null) {
            user = userMapper.getUserById(userMapper.getUserIdByUnionidQq(unionidQq));
        } else return null;
        if (user == null) return null;
        user.setToken(JwtUtils.getToken(user));
        return user;
    }

    /**
     * get_user 查询用户信息，没找到就返回null
     *
     * @param token 用户token
     * @param unionidQq QQ的unionid
     * @param id 用户id
     * @return 用户对象
     */
    @GetMapping("get_user")
    User getUser(String token, String unionidQq, Long id) {
        if (token != null) {
            Long userId = JwtUtils.getId(token);
            if (userId == 0) return null;
            return userMapper.getUserById(userId);
        } else if (unionidQq != null) {
            return userMapper.getUserById(userMapper.getUserIdByUnionidQq(unionidQq));
        } else if (id != null) {
            return userMapper.getUserById(id);
        } else return null;
    }

    /**
     * update_setting 更新用户设置
     *
     * @param token       用户token
     * @param settingJson settingJSON字符串
     * @return 影响的条数
     */
    @PostMapping("update_setting")
    Integer updateSetting(String token, String settingJson) {
        Long id = JwtUtils.getId(token);
        if (id == 0) return 0;

        JSONObject setting = JSON.parseObject(settingJson);
        return userMapper.updateSetting(id, setting);
    }

    /**
     * update_openid_q 更新用户openidQ
     *
     * @param token 用户token
     * @param openidQ openidQ
     * @return 影响的条数
     */
    @PostMapping("update_openid_q")
    Integer updateOpenidQ(String token, String openidQ) {
        Long id = JwtUtils.getId(token);
        if (id == 0) return 0;

        System.out.println(id);
        System.out.println(openidQ);

        return userMapper.updateOpenidQ(id, openidQ);
    }

    /**
     * update_user 编辑User
     *
     * @param token   用户令牌
     * @param userJson User的JSON字符串，log id 必传
     * @return 受影响的条数，失败返回0
     */
    @PostMapping("update_user")
    public Integer updateUser(String token, String userJson) {
        Long userid = JwtUtils.getId(token);
        if (userid == 0) return 0;
        User user = User.getUserByJson(userJson);
        user.setId(userid); // 重置一下从token获取的userid，前端就不用传了
        System.out.println(user);
        return userMapper.updateUser(user);
    }


    /*注册相关接口*************************/

    /**
     * signin/captcha_img 图形验证码接口
     *
     * @param request  createTypeFlag
     *                 ch 截取汉字
     *                 nl 截取数字和字母的组合
     *                 n 截取数字
     *                 l 截取字母
     * @param response 回传image/jpeg的图片
     */
    @GetMapping("signin/captcha_img")
    public void captchaImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
        DrawCaptchaImage captchaImg = new DrawCaptchaImage(request.getParameter("createTypeFlag"));

        // 本应该将随机数存在session中的，但是发现 不同 controller 用的是不同的session
        request.getServletContext().setAttribute("captcha", captchaImg.random);
        System.out.println("后端验证码：" + captchaImg.random);

        response.setContentType("image/jpeg");
        response.setDateHeader("expires", -1);
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        //将图片写给浏览器
        ImageIO.write(captchaImg.bi, "jpg", response.getOutputStream());
    }

    /**
     * signin/signin 注册接口
     *
     * @param name    用户名
     * @param pswd    密码
     * @param captcha 验证码
     * @return 用户ID  -1验证码错误 0用户名已存在
     */
    @PostMapping("signin/signin")
    public Long signin(String name, String pswd,
                       String captcha, HttpServletRequest request) {
        // 获取正确的验证码
        String serverCaptcha = (String) request.getServletContext().getAttribute("captcha");
        // 比较验证码，不区分大小写
        if (captcha.equalsIgnoreCase(serverCaptcha)) return signin(name, pswd);
        else return -1L;
    }

    /**
     * 注册重载，不向外暴露。要先插入用户名密码表，再插入用户信息表。
     *
     * @param name 用户名
     * @param pswd 密码
     * @return 用户ID， 如果用户名重复就返回0
     */
    public Long signin(String name, String pswd) {
        if (null != userMapper.getUserIdByName(name)) return 0L; // 用户名已存在
        User user = new User(name, pswd);
        // 插入用户名密码表
        if (1 == userMapper.insertUserLogin(user))
            userMapper.insertUser(user); // 插入用户信息表
        return user.getId();
    }

    /**
     * update_user 编辑User
     *
     * @param token   用户令牌
     * @param platform "qq", "weixin"
     * @param unionid unionid
     * @return 受影响的条数，失败返回0
     */
    @PostMapping("bind_platform")
    public Integer bindPlatform(String token, String platform, String unionid) {
        Long userid = JwtUtils.getId(token);
        if (userid == 0) return 0;
        return userMapper.bindPlatform(userid, platform, unionid);
    }

}
